home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / shell / taskmana / src / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-05  |  10.2 KB  |  455 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <egb.h>
  9. #include <guidbg.h>
  10.  
  11. char    *guiEgbPtr ;            /*    EGB のワークアドレス    */
  12.  
  13. extern int    quitIconID ;
  14. extern int    messageID[] ;
  15. //extern int    taskButtonID[] ;
  16. extern int    aboutDButtonID ;
  17. extern int    dialogMenuID;
  18. extern int    aboutMessageID[];
  19.  
  20. #include <file_dlg.h>
  21. //#include <eintm.h>
  22. #include <mos.h>
  23. #include <KH.h>
  24. //#define DEBUG
  25. #define ERROR    (-1)
  26. #define MOSWAITPTR    (81)
  27.  
  28. extern int    readMenuFunc(void);
  29. extern int    aboutFlag ;
  30. extern char    *menuItemMsg ;        //メニューアイテムメッセージ保存用
  31. extern int    memLotID;
  32. extern char    *apliPath;        //アプリパス
  33. extern int    *apliSaveFlag;    //アプリ退避フラグ(TRUE:退避中)
  34. extern int    apliNum;        //登録アプリ数
  35. extern int    MenuItemID[];
  36.  
  37. extern char *aboutMsg;
  38.  
  39. void    userIdleTask(void);
  40. void    restartEXG(void);
  41. void    menuENABLE(void);
  42.  
  43. char *taskListMsg[12] = {
  44.                     "┏━━━━━━━━━━━━━━━━━━┓\0",
  45.                     "┃┌────────────────┐┃\0",
  46.                     "┃│               ▼               │┃\0",
  47.                     "┃│      ネTaskmanaヌ      │┃\0",
  48.                     "┃│               ▲               │┃\0",
  49.                     "┃│          Version 1.00          │┃\0",
  50.                     "┃│                                │┃\0",
  51.                     "┃│     ツProgrammed by 機拡チ     │┃\0",
  52.                     "┃│                                │┃\0",
  53.                     "┃└────────────────┘┃\0",
  54.                     "┗━━━━━━━━━━━━━━━━━━┛\0",
  55.                     "アプリの数:000\0"
  56.                 } ;
  57.  
  58. int taskOldID[10]=-1;
  59. int taskOldCount = 1000;
  60. int taskListUpdateFlag = FALSE ;
  61. int taskFlag=0;
  62.  
  63. int quitFuncRet = ILLEGAL_FUNCTION ;
  64.  
  65. int userFunc(apliId, messId, info, data)
  66. int    apliId;
  67. int    messId;
  68. int    info;
  69. int    data;
  70. {
  71.     int        ret;
  72.     EVENT    *ev;
  73.     POINT    pt;
  74.  
  75.     ret = ILLEGAL_FUNCTION;
  76.  
  77.     switch(messId)
  78.     {
  79.         case    GM_QUIT :
  80.             MMI_SendMessage( quitIconID, MM_EXEC, 2, 0, 0 );
  81.             ret = quitFuncRet ;
  82.             break;
  83.  
  84.         case    GM_SLEEP :
  85.             #ifdef DEBUG
  86.             printf("--==<<GM_SLEEP>>==--\n");
  87.             #endif
  88.             if(aboutFlag == TRUE)
  89.             {
  90.                 //    消去する
  91.                 MMI_SendMessage( aboutDButtonID, MM_EXEC, 2, 0, 0 );
  92.                 aboutFlag = FALSE ;
  93.             }
  94.             taskListUpdateFlag = TRUE ;
  95.             //    タスクリスト更新
  96. //            userIdleTask();
  97.             MMI_SendMessage(dialogMenuID,MM_ENABLE,1,FALSE);
  98.             MMI_SendMessage(dialogMenuID,MM_SHOW,0);
  99.             break;
  100.  
  101.         case    GM_WAKE :
  102.             #ifdef DEBUG
  103.             printf("--==<<GM_WAKE>>==--\n");
  104.             #endif
  105. /*            static int    argv[2] = { 1, 1 } ;
  106.             EVENT    ev ;
  107.             ev.what = EVEXEC ;
  108.             ev.shift = 0 ;
  109.             ev.info = (int)menuENABLE;
  110.             ev.data = (int)argv ;
  111.             MMI_SetEvnt(&ev) ;
  112. */
  113.  
  114.             if(MMI_SnsEvnt(EVMOSDN,&ev)==0)
  115.             {
  116.                 pt.x=(( POINT * )&( ev->info ))->x;
  117.                 pt.y=(( POINT * )&( ev->info ))->y;
  118.                 #ifdef DEBUG
  119.                 printf("EVMOSDN(%d,%d)=",pt.x,pt.y);
  120.                 #endif
  121.                 if(MMI_CheckInside( dialogMenuID, &pt )!=FOUTSIDE)
  122.                 {
  123.                     MMI_FlushEvnt();
  124.                     #ifdef DEBUG
  125.                     printf("FINSIDE\n");
  126.                     #endif
  127.                 }
  128.                 #ifdef DEBUG
  129.                 else printf("FOUTSIDE\n");
  130.                 #endif
  131.  
  132.             }
  133.             MMI_SendMessage(dialogMenuID,MM_ENABLE,1,TRUE);
  134.             MMI_SendMessage(dialogMenuID,MM_SHOW,0);
  135.             //    タスクリスト更新
  136.             taskListUpdateFlag = ENABLE ;
  137.             taskFlag=0;
  138.             break;
  139.  
  140.         default : break;
  141.     }
  142.  
  143.     return(ret);
  144. }
  145. /*
  146. void menuENABLE(void)
  147. {
  148.     MMI_SendMessage(dialogMenuID,MM_ENABLE,1,TRUE);
  149.     MMI_SendMessage(dialogMenuID,MM_SHOW,0);
  150.  
  151.     return ;
  152. }
  153. */
  154.  
  155. void restartEXG(void)
  156. {
  157.     int i;
  158.  
  159.     //退避されてたEXGを再起動
  160.     for(i=0;i<apliNum;i++)
  161.         if(apliSaveFlag[i] == TRUE)
  162.         {
  163.             MMI_CallMessage(MMI_GetApliId(),GM_INVOKE,FALSE,
  164.                                                 (int)&(apliPath[i*128]));
  165.             apliSaveFlag[i] = FALSE;
  166.         }
  167.  
  168.     taskListUpdateFlag = ENABLE ;
  169.     taskFlag=0;
  170.     userIdleTask();
  171. //    taskListUpdateFlag = FALSE ;
  172.  
  173.     return ;
  174. }
  175.  
  176. void main(int argc,char *argv[])
  177. {
  178.     int mret,mptr;
  179.  
  180.     //パラメータをチェック
  181. /*    while(--argc>0)
  182.     {
  183.         if(argv[argc][0] == '-')
  184.             switch(argv[argc][1])
  185.             {
  186.                 case    'E' :
  187.             }
  188.     }*/
  189.  
  190.     static MMICTRL mmi ={
  191.                 SCREEN16|SCREENIGNORE,        // ページ0側解像度
  192.                 SCREENUNUSED,                // ページ1側解像度
  193.                 0,                             // 書き込みページ
  194.                 SCREENAVAILABLE,             // 表示ページ
  195.                 0,                             // 表示プライオリティ
  196.                 SCREENAVAILABLE,            // 色数
  197.                 SCREENEXPAND,                 // VRAMの横の長さ
  198.                 0,                             // メモリ領域の大きさ
  199.                 NULL,                         // メモリ領域のアドレス
  200.                 0,                             // ユーザ領域の大きさ
  201.                 NULL,                         // ユーザ領域のアドレス
  202.                 0, 0,                         // 画面枠    lupx,lupy
  203.                 0, 0,                        //            rdwx,rdwy
  204.                 -16384, -16384,                // 移動枠    lupx,lupy
  205.                 16383, 16383,                //            rdwx,rdwy
  206.                 15,                         // 白色
  207.                 8,                          // 黒色
  208.                 7,                          // 灰色
  209.                 6                             // 反転色
  210.     };
  211.  
  212.     extern int APL_init() ;
  213.     extern int APL_end() ;
  214.  
  215.     /*    初期化処理    */
  216.     if (MMI_Open( &mmi ) == NOERR)
  217.     {
  218.         mret = MG_PushPtr(MOSWAITPTR,&mptr);
  219.         /*    初期化に成功すればメインループに入る.    */
  220.         if (APL_init() == NOERR)
  221.         {
  222.             if(mret==0) MG_PopPtr( mptr );
  223.             MMI_ExecSystem() ;
  224.             mret = MG_PushPtr(MOSWAITPTR,&mptr);
  225.             APL_end();
  226.             if(mret==0) MG_PopPtr( mptr );
  227.         } else if(mret==0) MG_PopPtr( mptr );
  228.     }
  229.  
  230.     /*    終了処理    */
  231.     MMI_Close() ;
  232.  
  233. }
  234.  
  235. int APL_init()
  236. {
  237.     extern MMIINIT    initDataGUI ;
  238.     extern MMIINIT    initDataABOUTGUI ;
  239.     extern MMIINIT    initDataSRCGUI ;
  240.     extern MMIINIT    initDataCMNDGUI ;
  241.  
  242.     int    ret ;
  243.  
  244.     /*    EGB ワークアドレスの取得.    */
  245.     guiEgbPtr = MMI_GetEgbPtr() ;
  246.  
  247.     /*    ユーザアイコン設定        */
  248.     extern unsigned char *iconTbl[];
  249.     extern int iconMaxId;
  250.     MMI_SetIconTable(iconTbl, iconMaxId);
  251.  
  252.     /*    ハイパ型部品の初期化            */
  253.     if ((ret = MMI_initHyper()) < 0)
  254.         return ret ;
  255.     /*    ダイアログ型部品の初期化        */
  256.     if ((ret = MMI_initDialogL40()) < 0)
  257.         return ret ;
  258.     /*    アラート型部品の初期化            */
  259.     if ((ret = MMI_initAlertL40()) < 0)
  260.         return ret ;
  261.     /*    メッセージ型部品の初期化        */
  262.     if ((ret = MMI_initMessageL40()) < 0)
  263.         return ret ;
  264.     /*    メニュー型部品の初期化            */
  265.     if ((ret = MMI_initMenuL40()) < 0)
  266.         return ret ;
  267.     /*    ボタン型部品の初期化            */
  268.     if ((ret = MMI_initButtonL40()) < 0)
  269.         return ret ;
  270.     /*    ドロウボタン型部品の初期化        */
  271.     if ((ret = MMI_initDrawButtonL40()) < 0)
  272.         return ret ;
  273.     /*    アイコンボタン型部品の初期化    */
  274.     if ((ret = MMI_initIconL40()) < 0)
  275.         return ret ;
  276.     /*    メニューアイテム型部品の初期化    */
  277.     if ((ret = MMI_initMenuItemL40()) < 0)
  278.         return ret ;
  279.     /*    スクロール型部品の初期化        */
  280.     if ((ret = MMI_initScrollBarL40()) < 0)
  281.         return ret ;
  282.     /*    テキスト型部品の初期化            */
  283.     if ((ret = MMI_initTextL40()) < 0)
  284.         return ret ;
  285.     /*    リストメニュー型部品の初期化    */
  286.     if ((ret = MMI_initListMenuL40()) < 0)
  287.         return ret ;
  288.  
  289.     /*    背景データの初期化                        */
  290.  
  291.     /*    データの登録        */
  292.     if ((ret = MMI_Init(&initDataGUI)) < 0)
  293.         return ret ;
  294.     if ((ret = MMI_Init(&initDataABOUTGUI)) < 0)
  295.         return ret ;
  296.     if ((ret = MMI_Init(&initDataSRCGUI)) < 0)
  297.         return ret ;
  298.     if ((ret = MMI_Init(&initDataCMNDGUI)) < 0)
  299.         return ret ;
  300.  
  301.     //    Tmenuにパレットを合わせる
  302.     KH_initGuiColor();
  303. //    EIN_initGuiColor();
  304.  
  305.     //    初期化
  306.     int id;
  307.     id = MMI_GetApliId();
  308.     //    タスクリストの初期化
  309.     int i;
  310.     char *t;
  311.     for(i=0;i<12;i++)
  312.         MMI_SendMessage(messageID[i],MM_SETMSG,1,taskListMsg[i]);
  313.     //    シェルの名前をシェルボタンに登録
  314.     i = MMI_CallMessage(id, GM_QUERYID, QM_ALLKIND, 0 );
  315.     t = ( char * )MMI_CallMessage( i, GM_TITLE, (int)NULL, 0 );
  316.     i=0;
  317.     while(t[i]!='\0') {taskListMsg[10][i]=t[i];i++;}
  318.     for(;i<40;i++) taskListMsg[10][i]=' ';
  319.     taskListMsg[10][40]='\0';
  320.  
  321.     MMI_SendMessage( aboutMessageID[2],MM_SETMSG,1, aboutMsg);
  322.  
  323. //    MMI_CallMessage(id, GM_SLEEP, 0, 0 );
  324.  
  325.     //「圧縮」メニューは未対応
  326.     MTL_setAtrObj(MenuItemID[8],MS_INACTIVEL40);
  327.  
  328.     /*    背景を表示する                            */
  329.     MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;
  330.  
  331.     MMI_SendMessage(MMI_GetBaseObj(), MM_SETEXEC, 1, userFunc);
  332.     MMI_CallMessage(id, GM_TITLE, (int)"taskmana                        By 機拡", 0);
  333.  
  334.     //メニュー読み込み
  335.     if(readMenuFunc()!=NOERR) return ERROR ;
  336.  
  337.     //    アイドルタスク
  338.     MMI_SetIdleTaskFunc( userIdleTask );
  339.     taskListUpdateFlag = TRUE ;
  340.     userIdleTask();
  341.     taskListUpdateFlag = FALSE ;
  342.     #ifdef DEBUG
  343.     printf("アイドルタスクセット\n");
  344.     #endif
  345.  
  346.     //┏━━━━━━━━━━━┓
  347.     //┃ファイルダイアログ設定┃
  348.     //┗━━━━━━━━━━━┛
  349.     //    起動時のカレントドライブ・ディレクトリを保存
  350.     FDG_SaveCurDir() ;
  351.     //    ファイルダイアログの初期化
  352.     FDG_InitFileDlg() ;
  353.     //    ファイルダイアログのタイトルを設定する
  354.     FDG_SetTitle("実行ファイル選択", "実 行", "取 消") ;
  355.  
  356.     return NOERR ;
  357. }
  358.  
  359. int APL_end()
  360. {
  361.     //メニュー用領域開放
  362.     TL_freeLot( memLotID ); 
  363.  
  364.     //    ファイルダイアログのメモリ解放
  365.     FDG_FreeFileDlg() ;
  366.     //    カレントドライブ・ディレクトリを復帰
  367.     FDG_RecovCurDir() ;
  368.  
  369.     return NOERR ;
  370. }
  371.  
  372. void userIdleTask(void)
  373. {
  374.     int mx,my,myID,count,id,i,j ;
  375.     char *t;
  376.  
  377.     if(taskListUpdateFlag == FALSE) return ;
  378.     else
  379.     {
  380.         myID  = MMI_GetApliId();
  381.  
  382.         if(taskListUpdateFlag==ENABLE)
  383.         {
  384.             for(i=0;i<10;i++) taskOldID[i]=-1;
  385.             taskOldCount=1000;
  386.             if(taskFlag>0)
  387.             {
  388.                 --taskFlag;
  389.                 return;
  390.             }
  391.             else
  392.                 taskListUpdateFlag=FALSE;
  393.         }
  394.         else
  395.         {
  396.             MOS_rdpos( &i, &mx, &my );
  397.             if(mx==0 && my==0)
  398.             {
  399.                 if(myID!=MMI_CallMessage(myID, GM_QUERYID, QM_ALLKIND, 1 ))
  400.                 MMI_CallMessage(myID, GM_WAKE, 0, 0 );
  401.             }
  402.         }
  403.     }
  404.  
  405.     count = MMI_CallMessage( myID, GM_QUERYID, QM_ALLCOUNT, 0 );
  406.     #ifdef DEBUG
  407.     printf("count = %d\n",count);
  408.     #endif
  409.     count--;
  410.     if(count>10) count = 10;
  411.  
  412.     for(i=0;i<count;i++)
  413.     {
  414.         id = MMI_CallMessage( myID, GM_QUERYID, QM_ALLKIND, i+1 );
  415.         if(taskOldID[i]!=id)
  416.         {
  417.             taskOldID[i] = id;
  418.             t = ( char * )MMI_CallMessage( id, GM_TITLE, (int)NULL, 0 );
  419.             j=0;
  420.             while(t[j]!='\0') {taskListMsg[i][j]=t[j];j++;}
  421.             for(;j<40;j++) taskListMsg[i][j]=' ';
  422.             taskListMsg[i][40]='\0';
  423.             #ifdef DEBUG
  424.             printf("%s(%d)\n",taskListMsg[i],i);
  425.             #endif
  426.             MMI_SendMessage(messageID[i],MM_SHOW,0);
  427.         }
  428.     }
  429.  
  430.     if(count<taskOldCount)
  431.     {
  432.         for(i=count;i<10;i++)
  433.         {
  434.             taskOldID[i] = -1;
  435.             for(j=0;j<40;j++) taskListMsg[i][j] = '-' ;
  436.             taskListMsg[i][40] = '\0';
  437.             #ifdef DEBUG
  438.             printf("----------------------------------------(%d)\n",i);
  439.             #endif
  440.             MMI_SendMessage(messageID[i],MM_SHOW,0);
  441.         }
  442.     }
  443.  
  444.     if(count!=taskOldCount)
  445.     {
  446.         taskListMsg[11][11] = '0' + ((count/100)%10);
  447.         taskListMsg[11][12] = '0' + ((count/ 10)%10);
  448.         taskListMsg[11][13] = '0' + ( count     %10);
  449.         MMI_SendMessage(messageID[11],MM_SHOW,0);
  450.         taskOldCount = count;
  451.     }
  452.  
  453.     return ;
  454. }
  455.